﻿using System;
using System.Collections.Generic;

using System.Text;
using Sinacor.Tools.Dado;

namespace Sinacor.Tools.Negocio
{
    public enum QueryType
    {
        SelecionaTodos,
        SelecionaPorModulos,
        SelecionaPorSubmodulos,
        SelecionaPorCodigoExcecao,
        SelecionaPorCodigoExcecaoModuloESubmodulo,
        SelecionaApenasModulos,
        SelecionaApenasSubmodulos
    }

    public class MensagemExcecao : NegocioBase<Entidade.MensagemExcecao>
    {
        protected Dado.MensagemExcecao dados = null;


        public void salvar(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            if (entidade.Id != null)
            {
                this.alterar(entidade);
            }
            else
            {
                this.incluir(entidade);
            }
        }

        public override void incluir(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            
            entidade.Id = Negocio.Modulo.buscarProximoId(entidade.Modulo);
            if (entidade.Mensagem.Id == null)
                entidade.Mensagem.Id = Negocio.Mensagem.buscarIdMensagemPadrao();

            validaInclusao(entidade);
            dados = new Sinacor.Tools.Dado.MensagemExcecao();
            dados.incluir(entidade);
        }

        

        public override void alterar(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            validaAlteracao(entidade);
            dados = new Sinacor.Tools.Dado.MensagemExcecao();
            dados.alterar(entidade);
        }

        public override void deletar(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            if (!Permissoes.usuarioPossuiPermissaoRecurso("excecao", "deletar", this.getUser(), this.getPermissionXmlPath()))
                throw new Exception("Usuário não cadastrado para esta operação!");            
            validaDelecao(entidade);

            dados = new Sinacor.Tools.Dado.MensagemExcecao();
            dados.deletar(entidade);
        }

        public override List<Sinacor.Tools.Entidade.MensagemExcecao> consultar(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            dados = new Sinacor.Tools.Dado.MensagemExcecao();
            List<Sinacor.Tools.Entidade.MensagemExcecao> lista = dados.consultar(entidade);
            lista.Sort(entidade);
            return lista;
        }

        public void validaInclusao(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            this.validar(entidade);
        }

        public void validaAlteracao(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            this.validar(entidade);
        }

        public void validaDelecao(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            if (entidade.Id == null || entidade.Id < 0)
            {
                throw new Exception("Para deletar um item é necessário o preenchimento do código!");
            }
        }
        
        protected void validar(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            string mensagem = string.Empty;
            if (string.IsNullOrEmpty(entidade.Descricao))
            {
                mensagem += "Campo mensagem obrigatório!" + Environment.NewLine;
            }

            if (string.IsNullOrEmpty(entidade.Modulo))
            {
                mensagem += "Campo módulo obrigatório!" + Environment.NewLine;
            }

            if (string.IsNullOrEmpty(entidade.Submodulo))
            {
                mensagem += "Campo submodulo obrigatório!" + Environment.NewLine;
            }

            /*
            if (entidade.Mensagem == null || entidade.Mensagem.Id == null)
            {
                mensagem += "Campo da mensagem vinculada obrigatório!" + Environment.NewLine;
            }*/

            if (entidade.Id == null || entidade.Id < 0)
            {
                mensagem += "Campo Id da mensagem obrigatório!" + Environment.NewLine;
            }


            if (mensagem != string.Empty) throw new Exception(mensagem);
        }

        public int buscarIdResourceKey(Sinacor.Tools.Entidade.MensagemExcecao entidade)
        {
            object id;
            lock (new object())
            {
                dados = new Dado.MensagemExcecao();
                id = dados.buscarIdResourceKey(entidade);
                if (id == null)
                    id = 0;

                return Convert.ToInt32(id);
            }
        }
        public object buscarProximoId()
        {
            object id;
            lock (new object())
            {
                dados = new Dado.MensagemExcecao();
                id = dados.buscarProximoId();
                if (id == null)
                    id = 0;

                return Convert.ToInt32(id);
            }
        }
    }
}
